MongoDB 是一種開放源代碼和跨平臺的面向文檔的 NoSQL 數(shù)據(jù)庫,在構(gòu)建處理大量數(shù)據(jù)的快速且可擴(kuò)展的應(yīng)用程序方面很受歡迎。與傳統(tǒng)關(guān)系型數(shù)據(jù)庫將數(shù)據(jù)存儲在表中不同,MongoDB 使用 JSON 格式將數(shù)據(jù)存儲在文檔中。在 JSON 格式中,數(shù)據(jù)被格式化為鍵值對,其中字段名稱和值由冒號分隔并封裝在花括號中。
由于其靈活的模式,MongoDB 是需要構(gòu)建快速、高度可擴(kuò)展的應(yīng)用程序以處理大量數(shù)據(jù)的開發(fā)人員的自然選擇。
MongoDB 的最新版本是 v5.0。它于 2021 年 7 月 13 日發(fā)布,并附帶新功能和增強(qiáng)功能,其中包括:
- 多云客戶端加密。
- 數(shù)據(jù)庫的實(shí)時重新分片。
- 具有 Windows 函數(shù)和聚簇索引的本機(jī)時間序列平臺。
- 一個穩(wěn)定的 API,可以在不影響代碼庫的情況下輕松升級到最新版本。
- Atlas Search 全文搜索解決方案。
還有更多。通過查看MongoDB 5.0 發(fā)行說明,您可以在最新版本的 MongoDB 中找到附加功能和修復(fù)的完整列表。
在本指南中,我們將重點(diǎn)介紹如何在 Ubuntu 20.04 上安裝 MongoDB 社區(qū)版。
第 1 步:安裝 MongoDB
第一步是安裝安裝過程中所需的先決條件包。為此,請運(yùn)行以下命令。
sudo apt install -y software-properties-common gnupg apt-transport-https ca-certificates
官方 Ubuntu 存儲庫提供了 MongoDB 包,可以使用 APT 包管理器在一個命令中安裝,如下所示:
sudo apt install -y mongodb
但是,存儲庫提供的 MongoDB 版本不是最新版本。在發(fā)布本指南時,Ubuntu 存儲庫提供的版本是 v3.6.8。同時,MongoDB提供的最新穩(wěn)定版本是5.0。
要安裝最新的 MongoDB 包,您需要將 MongoDB 包存儲庫添加到 Ubuntu 上的源列表文件中。
但首先,您需要使用 wget 命令在您的系統(tǒng)上導(dǎo)入 MongoDB 的公鑰,如下所示:
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
此命令生成以下輸出,表明已添加公鑰
輸出:
OK
接下來,將 MongoDB 的 APT 存儲庫添加到/etc/apt/sources.list.d目錄中。
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
該命令將mongodb-org-5.0.list文件添加到/etc/apt/sources.list.d/目錄中。該文件包含以下行:
deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse
添加存儲庫后,重新加載本地包索引。
sudo apt update
該命令刷新本地存儲庫并使 Ubuntu 知道新添加的 MongoDB 存儲庫。
一旦完成,安裝mongodb-org提供 MongoDB 的元包。
sudo apt install -y mongodb-org
安裝完成后,您可以驗(yàn)證安裝的 MongoDB 版本,如下所示:
mongod --version
該命令顯示有關(guān) MongoDB 的一些輸出,包括版本和 Git 版本以及其他詳細(xì)信息。
第二步:啟動并啟用MongoDB服務(wù)
默認(rèn)情況下,MongoDB 服務(wù)在安裝時處于禁用狀態(tài)。您可以通過運(yùn)行以下命令來驗(yàn)證這一點(diǎn):
sudo systemctl status mongod
要啟動 MongoDB 服務(wù),請執(zhí)行以下命令:
sudo systemctl start mongod
再次確認(rèn)服務(wù)是否正在運(yùn)行:
sudo systemctl status mongod
從上面的輸出中,您可以看到 MongoDB 已啟動并正在運(yùn)行。此外,您可以通過啟動與數(shù)據(jù)庫服務(wù)器的連接并運(yùn)行診斷命令來確認(rèn)數(shù)據(jù)庫已啟動并正在運(yùn)行。
顯示的命令連接到數(shù)據(jù)庫并顯示 MongoDB 的當(dāng)前版本、服務(wù)器 URL 和它正在偵聽的端口。
mongo --eval 'db.runCommand({ connectionStatus: 1 })'
此外,它還返回 MongoDB 內(nèi)部connectionStatus命令的值:
“ok”參數(shù)的值為 1 表示數(shù)據(jù)庫服務(wù)器正在按預(yù)期運(yùn)行。在第二行中,您可以看到服務(wù)器的 URL,即本地主機(jī)地址 (127.0.0.1) 和 MongoDB 正在偵聽的默認(rèn)端口 (27017)。
您還可以檢查默認(rèn)端口如下
sudo ss -pnltu | grep 27017
驗(yàn)證服務(wù)按預(yù)期運(yùn)行后,您現(xiàn)在可以啟用 MongoDB 以在啟動時啟動,如圖所示。
sudo systemctl enable mongod
至此,MongoDB 已成功安裝并配置為開機(jī)啟動。
第 3 步:在 MongoDB 中創(chuàng)建數(shù)據(jù)庫和用戶
到目前為止,您的 MongoDB 實(shí)例應(yīng)該正在運(yùn)行并配置為遠(yuǎn)程訪問。現(xiàn)在讓我們換個話題,探索如何在 MongoDB 中創(chuàng)建數(shù)據(jù)庫和用戶。
要訪問 MongoDB,請運(yùn)行以下命令:
mongosh
在進(jìn)入 MongoDB shell 之前,您將看到有關(guān) MongoDB 的一些信息,例如 MongoDB 和 MongoDB shell 的版本以及 Mongosh 文檔的 URL。
在 Mongo shell 提示符上方,您還會看到一條警告,指示尚未為數(shù)據(jù)庫啟用訪問控制,并且對數(shù)據(jù)和配置的讀寫訪問受到限制。顯示此警告是因?yàn)樯形磫⒂蒙矸蒡?yàn)證。所以不用擔(dān)心,一旦啟用對數(shù)據(jù)庫的身份驗(yàn)證,此警告就會消失。
默認(rèn)情況下,安裝時會創(chuàng)建三個數(shù)據(jù)庫。這些是admin、config和local。`要列出現(xiàn)有數(shù)據(jù)庫,請運(yùn)行以下命令:
> show dbs
要創(chuàng)建數(shù)據(jù)庫,請調(diào)用use后跟數(shù)據(jù)庫名稱的命令。例如,要創(chuàng)建一個名為employees運(yùn)行命令的數(shù)據(jù)庫:
> use employees
要確認(rèn)您當(dāng)前可以使用的數(shù)據(jù)庫,請運(yùn)行db命令。在這種情況下,您將獲得employees輸出
> db
MongoDB 提供了許多用于管理數(shù)據(jù)庫的 shell 方法。該db.createUser方法允許您在數(shù)據(jù)庫中創(chuàng)建新用戶。
該方法要求您定義用戶的用戶名和密碼以及您希望授予用戶的任何角色。此信息以 JSON 格式顯示。
下面是如何創(chuàng)建一個在數(shù)據(jù)庫cherry上具有讀寫角色的用戶的語法。employees
db.createUser(
{
user: "cherry",
pwd: "some_password",
roles: [ { role: "readWrite", db: "employees" } ]
}
)
您可以列出使用db.getUsers()所示方法創(chuàng)建的用戶。
db.getUsers();
或者,您可以運(yùn)行以下命令:
> show users
輸出:
[
{
_id: 'employees.cherry',
userId: UUID("lcde5d41-fbba-4c94-806e-6a3c25709f02"),
user: 'cherry',
db: 'employees',
roles: [ { role: 'readWrite', db: 'employees' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
]
要刪除用戶,請使用db.dropUser如圖所示的方法。
db.dropUser("cherry", {w: "majority", wtimeout: 4000})
輸出:
{ ok: 1 }
第 4 步:保護(hù) MongoDB
在 MongoDB 中,默認(rèn)情況下不啟用身份驗(yàn)證,這意味著任何有權(quán)訪問數(shù)據(jù)庫服務(wù)器的用戶都可以在沒有任何權(quán)限的情況下查看、添加和刪除數(shù)據(jù)。這是一個嚴(yán)重的漏洞,可能會嚴(yán)重破壞您的數(shù)據(jù)。鑒于此,我們將更進(jìn)一步,演示如何保護(hù) MongoDB。
第一步是創(chuàng)建一個管理用戶,為此,首先訪問 Mongo Shell。
mongosh
接下來,連接或切換到admin數(shù)據(jù)庫。
> use admin
接下來,通過粘貼這些行并按鍵盤上的 ENTER 鍵來創(chuàng)建數(shù)據(jù)庫用戶。
db.createUser(
{
user: "AdminCherry",
pwd: passwordPrompt(),
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
讓我們分解這段代碼。
該user: "AdminCherry"行創(chuàng)建了一個名為AdminCherry的管理用戶。
該pwd: passwordPrompt()方法會提示您輸入管理用戶的密碼。pwd:這是比要求您以明文形式鍵入密碼的字段更安全的替代方法。
該roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]行指定授予管理用戶的角色。admin在這里,管理用戶被授予對數(shù)據(jù)庫的讀寫權(quán)限。由于此角色是在admin數(shù)據(jù)庫中定義的,因此管理用戶實(shí)際上可以讀取和修改集群中的所有數(shù)據(jù)庫。
這是運(yùn)行命令后的輸出。
要退出 Mongo Shell,請運(yùn)行exit命令或按CTRL + C。
有了 Admin 用戶,下一步是啟用身份驗(yàn)證。為此,請打開mongod.conf文件。
sudo nano /etc/mongod.conf
向下滾動并找到該security?部分。取消注釋并添加authorization指令并將其設(shè)置為enabled.
security: authorization: enabled
請注意,該authorization參數(shù)是縮進(jìn)security的,但開頭沒有空格。
保存更改并退出配置文件。要應(yīng)用更改,請如圖所示重新啟動 Mongo 服務(wù)。
sudo systemctl restart mongod
此外,請務(wù)必檢查服務(wù)是否按預(yù)期運(yùn)行。
sudo systemctl status mongod
現(xiàn)在登錄到 Mongo Shell。
mongosh
這一次您會發(fā)現(xiàn)警告已經(jīng)消失。
但是,如果您嘗試執(zhí)行任何與數(shù)據(jù)庫相關(guān)的任務(wù)(例如查看數(shù)據(jù)庫),您將得到一些表明需要身份驗(yàn)證的輸出。
> show dbs
exit要使用身份驗(yàn)證登錄,首先,通過運(yùn)行命令注銷 Mongo Shell 。然后使用以下語法使用管理用戶登錄。
mongosh "mongodb://adminuser@mongo-ip-address:27017"
提供管理用戶的密碼,這一次,您之前遇到的所有身份驗(yàn)證警告都將消失。
從現(xiàn)在開始,只有管理用戶才有權(quán)限查看、創(chuàng)建和修改數(shù)據(jù)庫中的數(shù)據(jù)。
第 5 步:配置 MongoDB 以進(jìn)行遠(yuǎn)程訪問
默認(rèn)情況下,MongoDB 設(shè)置為在安裝它的同一臺服務(wù)器上進(jìn)行本地訪問。要啟用遠(yuǎn)程訪問,您需要編輯?/etc/mongod.conf文件,該文件是 MongoDB 的主要配置文件。
它包含數(shù)據(jù)庫存儲位置、日志記錄、網(wǎng)絡(luò)和進(jìn)程管理等設(shè)置。
因此,使用文本編輯器訪問配置文件。
sudo nano /etc/mongod.conf
找到該network interfaces部分并注意bindIP值。
# network interfaces net: port: 27017 bindIp: 127.0.0.1
默認(rèn)情況下,MongoDB 綁定到 127.0.0.1,這是環(huán)回地址接口。這意味著 MongoDB 只能接受來自安裝它的同一服務(wù)器的連接。
要允許遠(yuǎn)程訪問,請?zhí)砑右粋€逗號,然后是 Mongo 服務(wù)器的 IP 地址。
bindIp: 127.0.0.1, mongo-server-ip
保存更改并退出配置文件。要應(yīng)用所做的更改,請重新啟動 MongoDB 服務(wù)。
sudo systemctl restart mongod
如果啟用了 UFW,請運(yùn)行以下命令以允許來自遠(yuǎn)程計算機(jī)的傳入連接。
sudo ufw allow from remote_machine_ip to any port 27017
要使更改生效,請重新加載防火墻。
sudo ufw reload
第六步:遠(yuǎn)程訪問MongoDB
有幾種方法可以遠(yuǎn)程訪問 MongoDB shell。您可以使用 netcat 實(shí)用程序啟動到端口 27017 的 TCP 連接,這是 MongoDB 偵聽的默認(rèn)端口。
如果客戶機(jī)上沒有安裝 netcat,請按如下方式安裝。
sudo apt install netcat
要通過端口 27017 建立與 MongoDB 服務(wù)器的連接,請運(yùn)行以下命令:
nc -zv mongodb_server_ip 27017
出現(xiàn)以下輸出表示連接成功。
輸出:
Connection to mongodb_server_ip 27017 port [tcp/*] succeeded!
或者,您可以使用 Mongo Shell 登錄,如下所示。
mongosh "mongodb://username@mongo_server_ip:27017"
shell 會自動提示您輸入管理員用戶的密碼。
?專業(yè)提示:?使用 Mongo Shell 登錄選項(xiàng)時,請確??蛻舳撕瓦h(yuǎn)程 MongoDB 服務(wù)器上的 Mongo shell 版本相同。
第 7 步:使用 MongoDB 數(shù)據(jù)庫
您可以在 MongoDB 中執(zhí)行很多數(shù)據(jù)庫操作。例如,您可以create、和數(shù)據(jù)庫retrieve中的記錄。updatedelete
插入數(shù)據(jù)
要在集合中創(chuàng)建文檔,請使用.insertOne()方法。該方法支持多種數(shù)據(jù)類型,例如字符串、整數(shù)、布爾值和數(shù)組。
在上一步中,我們創(chuàng)建了一個名為employees的測試數(shù)據(jù)庫。我們現(xiàn)在將創(chuàng)建一個集合并添加一些文檔。集合包含一個或多個文檔
下面的命令創(chuàng)建一個名為staff的集合,并添加一個包含一些用戶數(shù)據(jù)的文檔,如圖所示。
db.staff.insertOne({ name: "Alice", age: 25, city: "London", married: true, hobbies: ["Travelling", "Swimming", "Cooking"] })
命令成功執(zhí)行后,您將獲得以下輸出。
輸出:
{
acknowledged: true,
insertedId: ObjectId("62647ff866c1f054568a11b5")
}
檢索數(shù)據(jù)
staff使用集合中已創(chuàng)建的文檔,您可以檢索它并使用該.find()方法過濾結(jié)果。
例如,要檢索staff集合中的所有文檔,請運(yùn)行以下命令:
db.staff.find()
輸出:
[
{
_id: ObjectId("62647ff866c1f054568a11b5"),
name: 'Alice',
age: 25,
city: 'London',
married: true,
hobbies: [ 'Travelling', 'Swimming', 'Cooking' ]
}
]
現(xiàn)在讓我們嘗試一些雄心勃勃的事情。我們將添加更多文檔并對集合運(yùn)行一些查詢。
db.staff.insertOne({ name: "Bob", age: 29, city: "Liverpool", married: false, hobbies: ["Hiking", "Watching movies", "Driving"] })
db.staff.insertOne({ name: "Winnie", age: 25, city: "Bristol", married: true, hobbies: ["Playing chess", "Surfing", "Painting"] })
查詢已婚員工的記錄,運(yùn)行以下命令:
db.staff.find({ married: true })
輸出僅提供已婚雇員的記錄。
輸出:
[
{
_id: ObjectId("62647ff866c1f054568a11b5"),
name: 'Alice',
age: 25,
city: 'London',
married: true,
hobbies: [ 'Travelling', 'Swimming', 'Cooking' ]
},
{
_id: ObjectId("626483d6b490694bc675b767"),
name: 'Winnie',
age: 25,
city: 'Bristol',
married: true,
hobbies: [ 'Playing chess', 'Surfing', 'Painting' ]
}
]
更新數(shù)據(jù)
要更新或修改記錄,請使用.update()方法。在此示例中,我們演示了如何name將第二條記錄的值從Bob更改為Robert。
db.staff.update({ name: "Bob" }, {$set: { name: "Robert" }})
顯示的輸出確認(rèn)記錄更新成功。
輸出:
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
您現(xiàn)在可以查詢是否可以找到與姓名Robert匹配的記錄,如下所示。
db.staff.find({ name: "Robert" })
輸出:
[
{
_id: ObjectId("626483c8b490694bc675b766"),
name: 'Robert',
age: 29,
city: 'Liverpool',
married: false,
hobbies: [ 'Hiking', 'Watching movies', 'Driving' ]
}
]
刪除數(shù)據(jù)
MongoDB shell 提供了兩種刪除記錄的方法:
.deleteOne() .deleteMany()
該.deleteOne()方法用于從集合中刪除單個記錄或文檔。
該.deleteMany()方法從集合中刪除多個文檔。
刪除單個記錄的最佳方法是使用記錄的_id值。這是賦予每條記錄的唯一值,優(yōu)于如下所示定義單個條目,后者會導(dǎo)致刪除帶有名稱的每條記錄Robert。
db.staff.deleteOne({ name: "Robert"})
因此,要安全地刪除Robert記錄而不影響具有相同名稱值的其他記錄,請_id改為指定該值。
db.staff.deleteOne({ _id: ObjectId("626483c8b490694bc675b766")})
輸出:
{ acknowledged: true, deletedCount: 1 }
此外,您可以根據(jù)特定條件刪除文檔。在這種情況下,使用.deleteMany()刪除多條記錄的方法。
例如,要刪除員工已婚員工集合中的所有文檔,請運(yùn)行命令:
db.staff.deleteMany({married: true})
輸出:
{ acknowledged: true, deletedCount: 1 }
要刪除集合中的所有文檔,請使用.deleteMany()不帶任何參數(shù)的方法:
db.staff.deleteMany({})
如果您嘗試查詢該集合,您會注意到輸出將是空白的,這清楚地表明所有文檔都已被刪除并且該集合現(xiàn)在為空。
結(jié)論
MongoDB 是一個功能強(qiáng)大且靈活的 NoSQL 數(shù)據(jù)庫,其受歡迎程度正在穩(wěn)步上升。它是構(gòu)建處理大量非結(jié)構(gòu)化數(shù)據(jù)的關(guān)鍵任務(wù)應(yīng)用程序的首選數(shù)據(jù)庫。














